import os
import pandas as pd
import re
import warnings
from pathlib import Path

def process_file(file_path, country_dict, output_dir, encoding='utf-8'):
    """
    处理单个Excel文件，将多维数据按国家展开为二维表格
    
    参数:
        file_path: 输入文件路径
        country_dict: 国家字典，格式如 {'USA': ('UnitedStates', '美国'), ...}
        output_dir: 输出目录路径
        encoding: Excel文件编码，默认为'utf-8'
    """
    # 确保输出目录存在
    os.makedirs(output_dir, exist_ok=True)
    
    # 文件路径规范化
    file_path = Path(file_path).resolve()
    if not file_path.exists():
        print(f"错误：文件 {file_path} 不存在，跳过处理")
        return
    
    try:
        # 获取基础信息
        file_name = file_path.name
        index_name = file_name.split("_Indicators")[0]
        
        # 尝试多种方式读取Excel文件
        try:
            # 首先尝试读取工作表
            df = pd.read_excel(file_path, sheet_name="Data", encoding=encoding)
        except ValueError:
            # 如果指定的工作表不存在，尝试直接读取文件内容
            print(f"警告：指定工作表'Data'可能不存在，尝试直接读取Excel表格数据")
            df = pd.read_excel(file_path, encoding=encoding)
        
        # 数据验证
        if df.empty or df.shape[0] < 1 or df.shape[1] < 2:
            print(f"错误：文件 {file_name} 数据格式无效，跳过处理")
            return
        
        # 确保Time列存在，如果不存在则创建默认值列
        if 'Time' not in df.columns:
            df['Time'] = 'Quarter_2023'  # 使用占位值
            print(f"警告：原文件没有'Time'列，已自动增加默认时间值")
        
        # 提取列信息（跳过时间列）
        country_columns = []
        
        # 新增：详细分析数据结构，提高处理准确性
        print(f"\n处理文件：{file_name}")
        print(f"发现{df.shape[1]}列数据，{df.shape[0]}行记录")
        
        # 扫描数据列，提取国家列
        valid_columns_count = 0
        pattern = r'\[([A-Z]{2,})\]'  # 匹配类似[USA]的格式
        
        for column in df.columns[1:]:
            if re.search(pattern, str(column)):
                country_columns.append(column)
                valid_columns_count += 1
        
        if valid_columns_count == 0:
            print("警告：文件中未找到国家码列，数据处理失败")
            return
        
        print(f"匹配到{valid_columns_count}个国家码列")
        
        # 数据准备 - 使用向量化操作替代嵌套循环
        warnings.filterwarnings('ignore')  # 暂时关闭pandas警告
        
        # 创建空列表存储处理后的数据
        data = []
        
        # 更高效的数据处理方式
        for country_col in country_columns:
            # 提取国家代码
            country_match = re.search(pattern, str(country_col))
            if not country_match:
                print(f"  - 警告：列 {country_col} 格式不符合预期，已跳过")
                continue
                
            country_code = country_match.group(1)
            
            # 获取中文国家名称（如果国家代码匹配且在字典中）
            country_info = country_dict.get(country_code)
            if not country_info:
                print(f"  - 警告：国家代码 {country_code} 在字典中不存在，已跳过")
                continue
            
            country_en, country_ch = country_info
            
            # 获取对应的值列
            value_col = df[country_col]
            
            # 创建年份匹配的数据 - 使用布尔索引代替循环
            years = df['Time']
            
            # 使用explode进行数据展开（针对年份列）
            year_series = years.drop_duplicates().reset_index(drop=True)
            
            # 不使用列表循环，而是使用向量化操作
            for i, year_val in enumerate(year_series):
                # 验证数据完整性
                if not isinstance(value_col.iloc[i], (int, float, str)):
                    print(f"  - 警告：列 {country_col} 中第{i}行的数据格式不正常：值={value_col.iloc[i]}")
                    value_val = pd.NA  # 使用pandas的NA表示缺失值
                else:
                    value_val = value_col.iloc[i]
                
                data.append({
                    '国名En': country_en,
                    '国名Ch': country_ch,
                    index_name: value_val,
                    'Year': year_val
                })
        
        # 警告信息清理
        warnings.filterwarnings('default')
        
        # 保存转换结果
        if not data:
            print("错误：未能从数据中提取有效内容")
            return False
        
        # 批量创建DataFrame
        transformed_df = pd.DataFrame(data, columns=['国名En', '国名Ch', index_name, 'Year'])
        
        # 执行数据清理
        transformed_df = transformed_df.dropna(subset=[index_name])
        
        # 校验输出文件
        if transformed_df.empty:
            print(f"错误：处理后无有效数据")
            return False
        
        # 构建输出路径
        output_file_path = os.path.join(output_dir, f"{index_name}_AfterProcess.xlsx")
        
        # 保存Excel文件，使用ExcelWriter优化输出
        with pd.ExcelWriter(output_file_path) as writer:
            transformed_df.to_excel(
                writer, 
                sheet_name='ProcessedData', 
                index=False,
                engine='openpyxl'
            )
        
        print(f"成功：{index_name}_AfterProcess.xlsx 已创建，共{len(transformed_df)}条记录")
        return True
    
    except Exception as e:
        # 详细的错误处理
        print(f"错误：处理文件 {file_name} 时发生错误 - {str(e)}")
        return False
